1 /++
2 This module was automatically generated from the following grammar:
3 
4 PlantUML_ClassDiagram:
5     UML             <- blank* "@startuml" eol Content* "@enduml" (blank* / eoi)
6 
7     Content         <   / Class
8                         / Comment
9                         / Inherit
10 
11     Class           <- "class" space+ ClassName blank* ClassBody?
12     ClassName       <- identifier
13     ClassBody       <  '{' (Class / ~(ClassContent*))* '}'
14     ClassContent    <- !Class !'}' .
15 
16     Inherit         <  InheritRight / InheritLeft
17     InheritRight    <  RelateIdFrom :('-'+ "|>") RelateIdTo
18     InheritLeft     <  RelateIdTo :("<|" '-'+) RelateIdFrom
19 
20     RelateIdFrom    <- identifier
21     RelateIdTo      <- identifier
22 
23     Comment         <- space* :'\'' ~((!eol .)*) :eol
24 
25 
26 +/
27 module plantuml_grammar.class_diagram;
28 
29 public import pegged.peg;
30 import std.algorithm: startsWith;
31 import std.functional: toDelegate;
32 
33 struct GenericPlantUML_ClassDiagram(TParseTree)
34 {
35     import std.functional : toDelegate;
36     import pegged.dynamic.grammar;
37     static import pegged.peg;
38     struct PlantUML_ClassDiagram
39     {
40     enum name = "PlantUML_ClassDiagram";
41     static ParseTree delegate(ParseTree)[string] before;
42     static ParseTree delegate(ParseTree)[string] after;
43     static ParseTree delegate(ParseTree)[string] rules;
44     import std.typecons:Tuple, tuple;
45     static TParseTree[Tuple!(string, size_t)] memo;
46     static this()
47     {
48         rules["UML"] = toDelegate(&UML);
49         rules["Content"] = toDelegate(&Content);
50         rules["Class"] = toDelegate(&Class);
51         rules["ClassName"] = toDelegate(&ClassName);
52         rules["ClassBody"] = toDelegate(&ClassBody);
53         rules["ClassContent"] = toDelegate(&ClassContent);
54         rules["Inherit"] = toDelegate(&Inherit);
55         rules["InheritRight"] = toDelegate(&InheritRight);
56         rules["InheritLeft"] = toDelegate(&InheritLeft);
57         rules["RelateIdFrom"] = toDelegate(&RelateIdFrom);
58         rules["RelateIdTo"] = toDelegate(&RelateIdTo);
59         rules["Comment"] = toDelegate(&Comment);
60         rules["Spacing"] = toDelegate(&Spacing);
61     }
62 
63     template hooked(alias r, string name)
64     {
65         static ParseTree hooked(ParseTree p)
66         {
67             ParseTree result;
68 
69             if (name in before)
70             {
71                 result = before[name](p);
72                 if (result.successful)
73                     return result;
74             }
75 
76             result = r(p);
77             if (result.successful || name !in after)
78                 return result;
79 
80             result = after[name](p);
81             return result;
82         }
83 
84         static ParseTree hooked(string input)
85         {
86             return hooked!(r, name)(ParseTree("",false,[],input));
87         }
88     }
89 
90     static void addRuleBefore(string parentRule, string ruleSyntax)
91     {
92         // enum name is the current grammar name
93         DynamicGrammar dg = pegged.dynamic.grammar.grammar(name ~ ": " ~ ruleSyntax, rules);
94         foreach(ruleName,rule; dg.rules)
95             if (ruleName != "Spacing") // Keep the local Spacing rule, do not overwrite it
96                 rules[ruleName] = rule;
97         before[parentRule] = rules[dg.startingRule];
98     }
99 
100     static void addRuleAfter(string parentRule, string ruleSyntax)
101     {
102         // enum name is the current grammar named
103         DynamicGrammar dg = pegged.dynamic.grammar.grammar(name ~ ": " ~ ruleSyntax, rules);
104         foreach(name,rule; dg.rules)
105         {
106             if (name != "Spacing")
107                 rules[name] = rule;
108         }
109         after[parentRule] = rules[dg.startingRule];
110     }
111 
112     static bool isRule(string s)
113     {
114 		import std.algorithm : startsWith;
115         return s.startsWith("PlantUML_ClassDiagram.");
116     }
117     mixin decimateTree;
118 
119     alias spacing Spacing;
120 
121     static TParseTree UML(TParseTree p)
122     {
123         if(__ctfe)
124         {
125             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.zeroOrMore!(blank), pegged.peg.literal!("@startuml"), eol, pegged.peg.zeroOrMore!(Content), pegged.peg.literal!("@enduml"), pegged.peg.or!(pegged.peg.zeroOrMore!(blank), eoi)), "PlantUML_ClassDiagram.UML")(p);
126         }
127         else
128         {
129             if (auto m = tuple(`UML`, p.end) in memo)
130                 return *m;
131             else
132             {
133                 TParseTree result = hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.zeroOrMore!(blank), pegged.peg.literal!("@startuml"), eol, pegged.peg.zeroOrMore!(Content), pegged.peg.literal!("@enduml"), pegged.peg.or!(pegged.peg.zeroOrMore!(blank), eoi)), "PlantUML_ClassDiagram.UML"), "UML")(p);
134                 memo[tuple(`UML`, p.end)] = result;
135                 return result;
136             }
137         }
138     }
139 
140     static TParseTree UML(string s)
141     {
142         if(__ctfe)
143         {
144             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.zeroOrMore!(blank), pegged.peg.literal!("@startuml"), eol, pegged.peg.zeroOrMore!(Content), pegged.peg.literal!("@enduml"), pegged.peg.or!(pegged.peg.zeroOrMore!(blank), eoi)), "PlantUML_ClassDiagram.UML")(TParseTree("", false,[], s));
145         }
146         else
147         {
148             forgetMemo();
149             return hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.zeroOrMore!(blank), pegged.peg.literal!("@startuml"), eol, pegged.peg.zeroOrMore!(Content), pegged.peg.literal!("@enduml"), pegged.peg.or!(pegged.peg.zeroOrMore!(blank), eoi)), "PlantUML_ClassDiagram.UML"), "UML")(TParseTree("", false,[], s));
150         }
151     }
152     static string UML(GetName g)
153     {
154         return "PlantUML_ClassDiagram.UML";
155     }
156 
157     static TParseTree Content(TParseTree p)
158     {
159         if(__ctfe)
160         {
161             return         pegged.peg.defined!(pegged.peg.or!(pegged.peg.wrapAround!(Spacing, Class, Spacing), pegged.peg.wrapAround!(Spacing, Comment, Spacing), pegged.peg.wrapAround!(Spacing, Inherit, Spacing)), "PlantUML_ClassDiagram.Content")(p);
162         }
163         else
164         {
165             if (auto m = tuple(`Content`, p.end) in memo)
166                 return *m;
167             else
168             {
169                 TParseTree result = hooked!(pegged.peg.defined!(pegged.peg.or!(pegged.peg.wrapAround!(Spacing, Class, Spacing), pegged.peg.wrapAround!(Spacing, Comment, Spacing), pegged.peg.wrapAround!(Spacing, Inherit, Spacing)), "PlantUML_ClassDiagram.Content"), "Content")(p);
170                 memo[tuple(`Content`, p.end)] = result;
171                 return result;
172             }
173         }
174     }
175 
176     static TParseTree Content(string s)
177     {
178         if(__ctfe)
179         {
180             return         pegged.peg.defined!(pegged.peg.or!(pegged.peg.wrapAround!(Spacing, Class, Spacing), pegged.peg.wrapAround!(Spacing, Comment, Spacing), pegged.peg.wrapAround!(Spacing, Inherit, Spacing)), "PlantUML_ClassDiagram.Content")(TParseTree("", false,[], s));
181         }
182         else
183         {
184             forgetMemo();
185             return hooked!(pegged.peg.defined!(pegged.peg.or!(pegged.peg.wrapAround!(Spacing, Class, Spacing), pegged.peg.wrapAround!(Spacing, Comment, Spacing), pegged.peg.wrapAround!(Spacing, Inherit, Spacing)), "PlantUML_ClassDiagram.Content"), "Content")(TParseTree("", false,[], s));
186         }
187     }
188     static string Content(GetName g)
189     {
190         return "PlantUML_ClassDiagram.Content";
191     }
192 
193     static TParseTree Class(TParseTree p)
194     {
195         if(__ctfe)
196         {
197             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.literal!("class"), pegged.peg.oneOrMore!(space), ClassName, pegged.peg.zeroOrMore!(blank), pegged.peg.option!(ClassBody)), "PlantUML_ClassDiagram.Class")(p);
198         }
199         else
200         {
201             if (auto m = tuple(`Class`, p.end) in memo)
202                 return *m;
203             else
204             {
205                 TParseTree result = hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.literal!("class"), pegged.peg.oneOrMore!(space), ClassName, pegged.peg.zeroOrMore!(blank), pegged.peg.option!(ClassBody)), "PlantUML_ClassDiagram.Class"), "Class")(p);
206                 memo[tuple(`Class`, p.end)] = result;
207                 return result;
208             }
209         }
210     }
211 
212     static TParseTree Class(string s)
213     {
214         if(__ctfe)
215         {
216             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.literal!("class"), pegged.peg.oneOrMore!(space), ClassName, pegged.peg.zeroOrMore!(blank), pegged.peg.option!(ClassBody)), "PlantUML_ClassDiagram.Class")(TParseTree("", false,[], s));
217         }
218         else
219         {
220             forgetMemo();
221             return hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.literal!("class"), pegged.peg.oneOrMore!(space), ClassName, pegged.peg.zeroOrMore!(blank), pegged.peg.option!(ClassBody)), "PlantUML_ClassDiagram.Class"), "Class")(TParseTree("", false,[], s));
222         }
223     }
224     static string Class(GetName g)
225     {
226         return "PlantUML_ClassDiagram.Class";
227     }
228 
229     static TParseTree ClassName(TParseTree p)
230     {
231         if(__ctfe)
232         {
233             return         pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.ClassName")(p);
234         }
235         else
236         {
237             if (auto m = tuple(`ClassName`, p.end) in memo)
238                 return *m;
239             else
240             {
241                 TParseTree result = hooked!(pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.ClassName"), "ClassName")(p);
242                 memo[tuple(`ClassName`, p.end)] = result;
243                 return result;
244             }
245         }
246     }
247 
248     static TParseTree ClassName(string s)
249     {
250         if(__ctfe)
251         {
252             return         pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.ClassName")(TParseTree("", false,[], s));
253         }
254         else
255         {
256             forgetMemo();
257             return hooked!(pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.ClassName"), "ClassName")(TParseTree("", false,[], s));
258         }
259     }
260     static string ClassName(GetName g)
261     {
262         return "PlantUML_ClassDiagram.ClassName";
263     }
264 
265     static TParseTree ClassBody(TParseTree p)
266     {
267         if(__ctfe)
268         {
269             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("{"), Spacing), pegged.peg.zeroOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.or!(pegged.peg.wrapAround!(Spacing, Class, Spacing), pegged.peg.fuse!(pegged.peg.wrapAround!(Spacing, pegged.peg.zeroOrMore!(pegged.peg.wrapAround!(Spacing, ClassContent, Spacing)), Spacing))), Spacing)), pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("}"), Spacing)), "PlantUML_ClassDiagram.ClassBody")(p);
270         }
271         else
272         {
273             if (auto m = tuple(`ClassBody`, p.end) in memo)
274                 return *m;
275             else
276             {
277                 TParseTree result = hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("{"), Spacing), pegged.peg.zeroOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.or!(pegged.peg.wrapAround!(Spacing, Class, Spacing), pegged.peg.fuse!(pegged.peg.wrapAround!(Spacing, pegged.peg.zeroOrMore!(pegged.peg.wrapAround!(Spacing, ClassContent, Spacing)), Spacing))), Spacing)), pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("}"), Spacing)), "PlantUML_ClassDiagram.ClassBody"), "ClassBody")(p);
278                 memo[tuple(`ClassBody`, p.end)] = result;
279                 return result;
280             }
281         }
282     }
283 
284     static TParseTree ClassBody(string s)
285     {
286         if(__ctfe)
287         {
288             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("{"), Spacing), pegged.peg.zeroOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.or!(pegged.peg.wrapAround!(Spacing, Class, Spacing), pegged.peg.fuse!(pegged.peg.wrapAround!(Spacing, pegged.peg.zeroOrMore!(pegged.peg.wrapAround!(Spacing, ClassContent, Spacing)), Spacing))), Spacing)), pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("}"), Spacing)), "PlantUML_ClassDiagram.ClassBody")(TParseTree("", false,[], s));
289         }
290         else
291         {
292             forgetMemo();
293             return hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("{"), Spacing), pegged.peg.zeroOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.or!(pegged.peg.wrapAround!(Spacing, Class, Spacing), pegged.peg.fuse!(pegged.peg.wrapAround!(Spacing, pegged.peg.zeroOrMore!(pegged.peg.wrapAround!(Spacing, ClassContent, Spacing)), Spacing))), Spacing)), pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("}"), Spacing)), "PlantUML_ClassDiagram.ClassBody"), "ClassBody")(TParseTree("", false,[], s));
294         }
295     }
296     static string ClassBody(GetName g)
297     {
298         return "PlantUML_ClassDiagram.ClassBody";
299     }
300 
301     static TParseTree ClassContent(TParseTree p)
302     {
303         if(__ctfe)
304         {
305             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.negLookahead!(Class), pegged.peg.negLookahead!(pegged.peg.literal!("}")), pegged.peg.any), "PlantUML_ClassDiagram.ClassContent")(p);
306         }
307         else
308         {
309             if (auto m = tuple(`ClassContent`, p.end) in memo)
310                 return *m;
311             else
312             {
313                 TParseTree result = hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.negLookahead!(Class), pegged.peg.negLookahead!(pegged.peg.literal!("}")), pegged.peg.any), "PlantUML_ClassDiagram.ClassContent"), "ClassContent")(p);
314                 memo[tuple(`ClassContent`, p.end)] = result;
315                 return result;
316             }
317         }
318     }
319 
320     static TParseTree ClassContent(string s)
321     {
322         if(__ctfe)
323         {
324             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.negLookahead!(Class), pegged.peg.negLookahead!(pegged.peg.literal!("}")), pegged.peg.any), "PlantUML_ClassDiagram.ClassContent")(TParseTree("", false,[], s));
325         }
326         else
327         {
328             forgetMemo();
329             return hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.negLookahead!(Class), pegged.peg.negLookahead!(pegged.peg.literal!("}")), pegged.peg.any), "PlantUML_ClassDiagram.ClassContent"), "ClassContent")(TParseTree("", false,[], s));
330         }
331     }
332     static string ClassContent(GetName g)
333     {
334         return "PlantUML_ClassDiagram.ClassContent";
335     }
336 
337     static TParseTree Inherit(TParseTree p)
338     {
339         if(__ctfe)
340         {
341             return         pegged.peg.defined!(pegged.peg.or!(pegged.peg.wrapAround!(Spacing, InheritRight, Spacing), pegged.peg.wrapAround!(Spacing, InheritLeft, Spacing)), "PlantUML_ClassDiagram.Inherit")(p);
342         }
343         else
344         {
345             if (auto m = tuple(`Inherit`, p.end) in memo)
346                 return *m;
347             else
348             {
349                 TParseTree result = hooked!(pegged.peg.defined!(pegged.peg.or!(pegged.peg.wrapAround!(Spacing, InheritRight, Spacing), pegged.peg.wrapAround!(Spacing, InheritLeft, Spacing)), "PlantUML_ClassDiagram.Inherit"), "Inherit")(p);
350                 memo[tuple(`Inherit`, p.end)] = result;
351                 return result;
352             }
353         }
354     }
355 
356     static TParseTree Inherit(string s)
357     {
358         if(__ctfe)
359         {
360             return         pegged.peg.defined!(pegged.peg.or!(pegged.peg.wrapAround!(Spacing, InheritRight, Spacing), pegged.peg.wrapAround!(Spacing, InheritLeft, Spacing)), "PlantUML_ClassDiagram.Inherit")(TParseTree("", false,[], s));
361         }
362         else
363         {
364             forgetMemo();
365             return hooked!(pegged.peg.defined!(pegged.peg.or!(pegged.peg.wrapAround!(Spacing, InheritRight, Spacing), pegged.peg.wrapAround!(Spacing, InheritLeft, Spacing)), "PlantUML_ClassDiagram.Inherit"), "Inherit")(TParseTree("", false,[], s));
366         }
367     }
368     static string Inherit(GetName g)
369     {
370         return "PlantUML_ClassDiagram.Inherit";
371     }
372 
373     static TParseTree InheritRight(TParseTree p)
374     {
375         if(__ctfe)
376         {
377             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, RelateIdFrom, Spacing), pegged.peg.discard!(pegged.peg.wrapAround!(Spacing, pegged.peg.and!(pegged.peg.oneOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("-"), Spacing)), pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("|>"), Spacing)), Spacing)), pegged.peg.wrapAround!(Spacing, RelateIdTo, Spacing)), "PlantUML_ClassDiagram.InheritRight")(p);
378         }
379         else
380         {
381             if (auto m = tuple(`InheritRight`, p.end) in memo)
382                 return *m;
383             else
384             {
385                 TParseTree result = hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, RelateIdFrom, Spacing), pegged.peg.discard!(pegged.peg.wrapAround!(Spacing, pegged.peg.and!(pegged.peg.oneOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("-"), Spacing)), pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("|>"), Spacing)), Spacing)), pegged.peg.wrapAround!(Spacing, RelateIdTo, Spacing)), "PlantUML_ClassDiagram.InheritRight"), "InheritRight")(p);
386                 memo[tuple(`InheritRight`, p.end)] = result;
387                 return result;
388             }
389         }
390     }
391 
392     static TParseTree InheritRight(string s)
393     {
394         if(__ctfe)
395         {
396             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, RelateIdFrom, Spacing), pegged.peg.discard!(pegged.peg.wrapAround!(Spacing, pegged.peg.and!(pegged.peg.oneOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("-"), Spacing)), pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("|>"), Spacing)), Spacing)), pegged.peg.wrapAround!(Spacing, RelateIdTo, Spacing)), "PlantUML_ClassDiagram.InheritRight")(TParseTree("", false,[], s));
397         }
398         else
399         {
400             forgetMemo();
401             return hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, RelateIdFrom, Spacing), pegged.peg.discard!(pegged.peg.wrapAround!(Spacing, pegged.peg.and!(pegged.peg.oneOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("-"), Spacing)), pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("|>"), Spacing)), Spacing)), pegged.peg.wrapAround!(Spacing, RelateIdTo, Spacing)), "PlantUML_ClassDiagram.InheritRight"), "InheritRight")(TParseTree("", false,[], s));
402         }
403     }
404     static string InheritRight(GetName g)
405     {
406         return "PlantUML_ClassDiagram.InheritRight";
407     }
408 
409     static TParseTree InheritLeft(TParseTree p)
410     {
411         if(__ctfe)
412         {
413             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, RelateIdTo, Spacing), pegged.peg.discard!(pegged.peg.wrapAround!(Spacing, pegged.peg.and!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("<|"), Spacing), pegged.peg.oneOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("-"), Spacing))), Spacing)), pegged.peg.wrapAround!(Spacing, RelateIdFrom, Spacing)), "PlantUML_ClassDiagram.InheritLeft")(p);
414         }
415         else
416         {
417             if (auto m = tuple(`InheritLeft`, p.end) in memo)
418                 return *m;
419             else
420             {
421                 TParseTree result = hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, RelateIdTo, Spacing), pegged.peg.discard!(pegged.peg.wrapAround!(Spacing, pegged.peg.and!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("<|"), Spacing), pegged.peg.oneOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("-"), Spacing))), Spacing)), pegged.peg.wrapAround!(Spacing, RelateIdFrom, Spacing)), "PlantUML_ClassDiagram.InheritLeft"), "InheritLeft")(p);
422                 memo[tuple(`InheritLeft`, p.end)] = result;
423                 return result;
424             }
425         }
426     }
427 
428     static TParseTree InheritLeft(string s)
429     {
430         if(__ctfe)
431         {
432             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, RelateIdTo, Spacing), pegged.peg.discard!(pegged.peg.wrapAround!(Spacing, pegged.peg.and!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("<|"), Spacing), pegged.peg.oneOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("-"), Spacing))), Spacing)), pegged.peg.wrapAround!(Spacing, RelateIdFrom, Spacing)), "PlantUML_ClassDiagram.InheritLeft")(TParseTree("", false,[], s));
433         }
434         else
435         {
436             forgetMemo();
437             return hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.wrapAround!(Spacing, RelateIdTo, Spacing), pegged.peg.discard!(pegged.peg.wrapAround!(Spacing, pegged.peg.and!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("<|"), Spacing), pegged.peg.oneOrMore!(pegged.peg.wrapAround!(Spacing, pegged.peg.literal!("-"), Spacing))), Spacing)), pegged.peg.wrapAround!(Spacing, RelateIdFrom, Spacing)), "PlantUML_ClassDiagram.InheritLeft"), "InheritLeft")(TParseTree("", false,[], s));
438         }
439     }
440     static string InheritLeft(GetName g)
441     {
442         return "PlantUML_ClassDiagram.InheritLeft";
443     }
444 
445     static TParseTree RelateIdFrom(TParseTree p)
446     {
447         if(__ctfe)
448         {
449             return         pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.RelateIdFrom")(p);
450         }
451         else
452         {
453             if (auto m = tuple(`RelateIdFrom`, p.end) in memo)
454                 return *m;
455             else
456             {
457                 TParseTree result = hooked!(pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.RelateIdFrom"), "RelateIdFrom")(p);
458                 memo[tuple(`RelateIdFrom`, p.end)] = result;
459                 return result;
460             }
461         }
462     }
463 
464     static TParseTree RelateIdFrom(string s)
465     {
466         if(__ctfe)
467         {
468             return         pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.RelateIdFrom")(TParseTree("", false,[], s));
469         }
470         else
471         {
472             forgetMemo();
473             return hooked!(pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.RelateIdFrom"), "RelateIdFrom")(TParseTree("", false,[], s));
474         }
475     }
476     static string RelateIdFrom(GetName g)
477     {
478         return "PlantUML_ClassDiagram.RelateIdFrom";
479     }
480 
481     static TParseTree RelateIdTo(TParseTree p)
482     {
483         if(__ctfe)
484         {
485             return         pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.RelateIdTo")(p);
486         }
487         else
488         {
489             if (auto m = tuple(`RelateIdTo`, p.end) in memo)
490                 return *m;
491             else
492             {
493                 TParseTree result = hooked!(pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.RelateIdTo"), "RelateIdTo")(p);
494                 memo[tuple(`RelateIdTo`, p.end)] = result;
495                 return result;
496             }
497         }
498     }
499 
500     static TParseTree RelateIdTo(string s)
501     {
502         if(__ctfe)
503         {
504             return         pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.RelateIdTo")(TParseTree("", false,[], s));
505         }
506         else
507         {
508             forgetMemo();
509             return hooked!(pegged.peg.defined!(identifier, "PlantUML_ClassDiagram.RelateIdTo"), "RelateIdTo")(TParseTree("", false,[], s));
510         }
511     }
512     static string RelateIdTo(GetName g)
513     {
514         return "PlantUML_ClassDiagram.RelateIdTo";
515     }
516 
517     static TParseTree Comment(TParseTree p)
518     {
519         if(__ctfe)
520         {
521             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.zeroOrMore!(space), pegged.peg.discard!(pegged.peg.literal!("\'")), pegged.peg.fuse!(pegged.peg.zeroOrMore!(pegged.peg.and!(pegged.peg.negLookahead!(eol), pegged.peg.any))), pegged.peg.discard!(eol)), "PlantUML_ClassDiagram.Comment")(p);
522         }
523         else
524         {
525             if (auto m = tuple(`Comment`, p.end) in memo)
526                 return *m;
527             else
528             {
529                 TParseTree result = hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.zeroOrMore!(space), pegged.peg.discard!(pegged.peg.literal!("\'")), pegged.peg.fuse!(pegged.peg.zeroOrMore!(pegged.peg.and!(pegged.peg.negLookahead!(eol), pegged.peg.any))), pegged.peg.discard!(eol)), "PlantUML_ClassDiagram.Comment"), "Comment")(p);
530                 memo[tuple(`Comment`, p.end)] = result;
531                 return result;
532             }
533         }
534     }
535 
536     static TParseTree Comment(string s)
537     {
538         if(__ctfe)
539         {
540             return         pegged.peg.defined!(pegged.peg.and!(pegged.peg.zeroOrMore!(space), pegged.peg.discard!(pegged.peg.literal!("\'")), pegged.peg.fuse!(pegged.peg.zeroOrMore!(pegged.peg.and!(pegged.peg.negLookahead!(eol), pegged.peg.any))), pegged.peg.discard!(eol)), "PlantUML_ClassDiagram.Comment")(TParseTree("", false,[], s));
541         }
542         else
543         {
544             forgetMemo();
545             return hooked!(pegged.peg.defined!(pegged.peg.and!(pegged.peg.zeroOrMore!(space), pegged.peg.discard!(pegged.peg.literal!("\'")), pegged.peg.fuse!(pegged.peg.zeroOrMore!(pegged.peg.and!(pegged.peg.negLookahead!(eol), pegged.peg.any))), pegged.peg.discard!(eol)), "PlantUML_ClassDiagram.Comment"), "Comment")(TParseTree("", false,[], s));
546         }
547     }
548     static string Comment(GetName g)
549     {
550         return "PlantUML_ClassDiagram.Comment";
551     }
552 
553     static TParseTree opCall(TParseTree p)
554     {
555         TParseTree result = decimateTree(UML(p));
556         result.children = [result];
557         result.name = "PlantUML_ClassDiagram";
558         return result;
559     }
560 
561     static TParseTree opCall(string input)
562     {
563         if(__ctfe)
564         {
565             return PlantUML_ClassDiagram(TParseTree(``, false, [], input, 0, 0));
566         }
567         else
568         {
569             forgetMemo();
570             return PlantUML_ClassDiagram(TParseTree(``, false, [], input, 0, 0));
571         }
572     }
573     static string opCall(GetName g)
574     {
575         return "PlantUML_ClassDiagram";
576     }
577 
578 
579     static void forgetMemo()
580     {
581         memo = null;
582     }
583     }
584 }
585 
586 alias GenericPlantUML_ClassDiagram!(ParseTree).PlantUML_ClassDiagram PlantUML_ClassDiagram;
587